package adfc2.actions;

import adfc2.core.Action;
import adfc2.core.Creature;

/**
 * Класс длительного действия
 */
public abstract class LongAction extends Action {
    public LongAction(Creature actor) {
        super(actor);
    }

    private boolean started = false;
    protected long totaltime = 0;

    @Override
    public final void tick(long dt) {
        if (!started) {
            started();
            started = true;
            if (failed) return;
        }
        totaltime += dt;

        if (progressing(dt) && !failed) {
            finished();
            completed();
        }
    }

    @Override
    public void cancel() {
        interrupted();
        if (!failed) completed();
    }

    /**
     * Обработка начала действия
     */
    protected abstract void started();

    /**
     * Обработка прогресса. true --- завершено.
     */
    protected abstract boolean progressing(long dt);

    /**
     * Обработка нормального завершения действия (вызывается, когда progressing==true)
     */
    protected abstract void finished();

    /**
     * Обработка прерывания действия
     */
    protected abstract void interrupted();

    /**
     * Приближённое значение прогресса (0.0-1.0)
     */
    public abstract double estimateProgress();
}
